package com.example.onlinemallsystem.service;

import com.example.onlinemallsystem.entity.Product;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Service
public interface ProductService {

    /**
     * 插入商品
     * @param product 商品实体
     * @return 插入成功返回1，失败返回0
     */
    int insertProduct(Product product);

    /**
     * 根据ID逻辑删除商品
     * @param id 商品ID
     * @return 更新成功返回1，失败返回0
     */
    int deleteProduct(Long id);

    /**
     * 更新商品信息
     * @param product 商品实体
     * @return 更新成功返回1，失败返回0
     */
    int updateProduct(Product product);

    /**
     * 根据ID查询商品
     * @param id 商品ID
     * @return 商品实体
     */
    Product selectProductById(Long id);

    /**
     * 查询所有商品
     * @return 商品列表
     */
    List<Product> selectAllProducts();

    /**
     * 根据分类ID查询商品
     * @param categoryId 分类ID
     * @return 商品列表
     */
    List<Product> selectProductsByCategoryId(Long categoryId);

    /**
     * 根据名称模糊查询商品
     * @param name 商品名称
     * @return 商品列表
     */
    List<Product> selectProductsByName(String name);

    /**
     * 增加商品销量
     * @param id 商品ID
     * @param amount 增加的销量
     * @return 更新成功返回1，失败返回0
     */
    int increaseProductSales(Long id,Integer amount);

    /**
     * 验证是否存在商品
     * @param name 商品名
     * @return 存在返回true 不存在返回false
     */
    boolean existsByName(String name);

    String uploadProductImage(Long productId, MultipartFile file) throws IOException;

    // 更新商品图片
    boolean updateProductImage(Long productId, String imageUrl);

    /**
     * 根据卖家ID查询商品
     * @param sellerId 卖家ID
     * @return 商品列表
     */
    List<Product> selectProductsBySellerId(Long sellerId);

    /**
     * 根据卖家ID和商品名称搜索商品
     * @param sellerId 卖家ID
     * @param name 商品名称
     * @return 商品列表
     */
    List<Product> selectSellerProductsByName(Long sellerId, String name);

    /**
     * 更新商品库存
     * @param id 商品ID
     * @param stock 新库存数量
     * @return 更新结果
     */
    int updateProductStock(Long id, Integer stock);

    /**
     * 更新商品价格
     * @param id 商品ID
     * @param price 新价格
     * @return 更新结果
     */
    int updateProductPrice(Long id, Double price);
}